package com.example.config;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {
    @Bean
    @LoadBalanced   //这里使用的就是负载均衡去请求服务提供者
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }


    //切换负载均衡策略，只要将不同的IRule的实现类注入到容器中
    /**
     *1	    RoundRobinRule	    按照线性轮询策略，即按照一定的顺序依次选取服务实例
     * 2	RandomRule	        随机选取一个服务实例（哈希算法随机，如hashmap底层的红黑树随机）
     * 3	RetryRule	        按照 RoundRobinRule（轮询）的策略来获取服务，如果获取的服务实例为 null 或已经失效，则在指定的时间之内不断地进行重试（重试时获取服务的策略还是 RoundRobinRule 中定义的策略），如果超过指定时间依然没获取到服务实例则返回 null 。
     * 4	WeightedResponseTimeRule 权重	WeightedResponseTimeRule 是 RoundRobinRule 的一个子类，它对 RoundRobinRule 的功能进行了扩展。 根据平均响应时间，来计算所有服务实例的权重，响应时间越短的服务实例权重越高，被选中的概率越大。刚启动时，如果统计信息不足，则使用线性轮询策略，等信息足够时，再切换到 WeightedResponseTimeRule。
     * 5	BestAvailableRule	继承自 ClientConfigEnabledRoundRobinRule。先过滤点故障或失效的服务实例，然后再选择并发量最小的服务实例。
     * 6	AvailabilityFilteringRule	先过滤掉故障跳闸或失效的服务实例，然后再选择并发量较小的服务实例轮询。
     * 7	ZoneAvoidanceRule	默认的负载均衡策略，综合判断服务所在区域（zone）的性能和服务（server）的可用性，来选择服务实例。在没有区域的环境下，该策略与轮询（RandomRule）策略类似。
     *
     */
    @Bean
    public IRule myRule(){
        return new RandomRule();
    }
}

